﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;

/* TODO:
 *		desenhar um form mais bonito e funcional
 *		terminar implementação da aba Títulos
 *		verificar existência do cliente ao incluir (requer alterações no DB)
 *		Método para alterar cadastros, além da inclusão
 */

namespace Rizmar
{
    public partial class ClienteForm : Form
    {
        public ClienteForm()
        {
            InitializeComponent();
        }

        private void sairButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void iDTextBox_Leave(object sender, EventArgs e)
        {
            if (iDTextBox.TextLength > 0 && iDTextBox.Text != "0")
            {
                string selectString = "SELECT * FROM Cliente WHERE id = " + iDTextBox.Text + "";
                string[] colunas = new string[] { "id", "nome", "documento", "logradouro", "numero", "bairro", "cep", "cidade", "estado", "telefone", "celular", "email",
                                                    "limite", "taxa", "d"};
                string[] atributos = new string[15];

                SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
                cn.Open();

                using (SqlCommand selectCommand = new SqlCommand(selectString, cn))
                {
                    SqlDataReader dr = selectCommand.ExecuteReader();
                    if (!dr.HasRows)
                    {
                        MessageBox.Show("Código inválido");
                        iDTextBox.Focus();
                        iDTextBox.SelectAll();
                    }
                    else
                    {
                        dr.Read();

                        for (int i = 0; i < 15; i++)
                            atributos[i] = dr[colunas[i]].ToString();
                        
                        setTextboxes(atributos);
                    }
                }
                cn.Close();
            }
            else
                foreach (Control c in splitContainer1.Panel1.Controls)
                    if (c is TextBox)
                        c.ResetText();
        }

        private void cNPJTextBox_TextChanged(object sender, EventArgs e)
        {
            if (cnpjTextBox.Text.Length == 2) cnpjTextBox.AppendText(".");
            else if (cnpjTextBox.Text.Length == 6) cnpjTextBox.AppendText(".");
            else if (cnpjTextBox.Text.Length == 10) cnpjTextBox.AppendText("/");
            else if (cnpjTextBox.Text.Length == 15) cnpjTextBox.AppendText("-");
        }
        
        private void cpfTextBox_TextChanged(object sender, EventArgs e)
        {
            if (cpfTextBox.Text.Length == 3) cpfTextBox.AppendText(".");
            else if (cpfTextBox.Text.Length == 7) cpfTextBox.AppendText(".");
            else if (cpfTextBox.Text.Length == 11) cpfTextBox.AppendText("-");
        }

        private void cnpjTextBox_Leave(object sender, EventArgs e)
        {
            if (cnpjTextBox.TextLength > 0 && validaCnpj(cnpjTextBox.Text) == false)
            {
                MessageBox.Show("CNPJ inválido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cnpjTextBox.Focus();
                cnpjTextBox.SelectAll();
            }
        }

        private void cpfTextBox_Leave(object sender, EventArgs e)
        {
            if (cpfTextBox.TextLength > 0 && validaCpf(cpfTextBox.Text) == false)
            {
                MessageBox.Show("CPF inválido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cpfTextBox.Focus();
                cpfTextBox.SelectAll();
            }
        }

        public bool validaCnpj (string cnpj)
        {
            int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma;
            int resto;
            string digito;
            string tempCnpj;
            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");
            if (cnpj.Length != 14) return false;
            tempCnpj = cnpj.Substring(0, 12);
            soma = 0;
            for (int i = 0; i < 12; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = resto.ToString();
            tempCnpj = tempCnpj + digito;
            soma = 0;
            for (int i = 0; i < 13; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();
            return cnpj.EndsWith(digito);
        }

        public bool validaCpf (string cpf)
        {
            int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            string tempCpf;
            string digito;
            int soma;
            int resto;
            cpf = cpf.Trim();
            cpf = cpf.Replace(".", "").Replace("-", "");
            if (cpf.Length != 11)
                return false;
            tempCpf = cpf.Substring(0, 9);
            soma = 0;
            for (int i = 0; i < 9; i++)
                soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];
            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = resto.ToString();
            tempCpf = tempCpf + digito;
            soma = 0;
            for (int i = 0; i < 10; i++)
                soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();
            return cpf.EndsWith(digito);
        }

        private void incluirButton_Click(object sender, EventArgs e)
        {
            if (iDTextBox.TextLength == 0)
            {
                if (validaInsert())
                {
                    string insertStr1 = "INSERT INTO Cliente (";
                    string insertStr2 = "VALUES (";

                    foreach (Control c in splitContainer1.Panel1.Controls)
                        if (c is TextBox)
                            if (c.Text.Length > 0)
                            {
                                if (c.Name == "cpfTextBox" || c.Name == "cnpjTextBox")
                                    insertStr1 += "documento,";
                                else
                                    insertStr1 += c.Name.Remove(c.Name.Length - 7).ToLower() + ",";
                                /* nvarchar precisa de aspas; int, float e real não */
                                if (c.Name == "idTextBox" || c.Name == "numeroTextBox")
                                    insertStr2 += string.Format("{0},", c.Text);
                                else
                                    insertStr2 += string.Format("'{0}',", c.Text);
                            }
                    foreach (Control c in splitContainer1.Panel2.Controls)
                        if (c is TextBox)
                        {
                            insertStr1 += c.Name.Remove(c.Name.Length - 7).ToLower() + ",";
                            insertStr2 += string.Format("{0},", c.Text);
                        }

                    insertStr1 += "status) ";
                    insertStr2 += "1) ";

                    SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
                    cn.Open();

                    using (SqlCommand insertCmd = new SqlCommand(insertStr1 + insertStr2, cn))
                    {
                        try
                        {
                            insertCmd.ExecuteNonQuery();
                        }
                        catch (SqlException)
                        {
                            MessageBox.Show("Existem campos inválidos. Verifique");
                        }
                    }
                    cn.Close();
                }
            }
        }

        private bool validaInsert()
        {
            if (nomeTextBox.TextLength == 0)
            {
                MessageBox.Show("Nome inválido");
                nomeTextBox.Focus();
                return false;
            }
            if (logradouroTextBox.TextLength == 0)
            {
                MessageBox.Show("Logradouro inválido");
                logradouroTextBox.Focus();
                return false;
            }
            if (validaCnpj(cnpjTextBox.Text) == false && validaCpf(cpfTextBox.Text) == false)
            {
                MessageBox.Show("Documento não preenchido!");
                cpfTextBox.Focus();
                return false;
            }
            if (estadoTextBox.TextLength > 2)
            {
                MessageBox.Show("Estado inválido!");
                estadoTextBox.Focus();
                estadoTextBox.SelectAll();
                return false;
            }

            return true;
        }

        private void pesquisarButton_Click(object sender, EventArgs e)
        {
            PesquisaClienteForm janela = new PesquisaClienteForm(this);
            janela.Show();
        }

        public void setClienteTextBox(string s) { nomeTextBox.Text = s; }
        public void setClienteID(string s) { iDTextBox.Text = s; }

        public void setTextboxes(string[] s)
        {
            int i = 0;
            foreach (Control c in splitContainer1.Panel1.Controls)
                if (c is TextBox)
                {
                    /* Tratar o caso do documento */
                    if (c.Name == "cpfTextBox" && validaCpf(s[i]))
                        c.Text = s[i++];
                    else if (c.Name == "cnpjTextBox" && validaCnpj(s[i]))
                        c.Text = s[i++];
                    
                    else if (c.Name != "cnpjTextBox" && c.Name != "cpfTextBox") c.Text = s[i++];
                }
            foreach (Control c in splitContainer1.Panel2.Controls)
                if (c is TextBox)
                    c.Text = s[i++];
        }

        private void deletarButton_Click(object sender, EventArgs e)
        {
            if (iDTextBox.TextLength > 0 && int.Parse(iDTextBox.Text) > 0)
            {
                bool confirma = (MessageBox.Show("Tem certeza de que deseja excluir o usuário selecionado?", "Confirmação", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes);
                if (confirma)
                {
                    bool sucesso = true;
                    SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
                    cn.Open();
                    string deleteStr = "DELETE FROM Cliente WHERE id = " + iDTextBox.Text + "";

                    using (SqlCommand deleteCmd = new SqlCommand(deleteStr, cn))
                    {
                        try
                        {
                            deleteCmd.ExecuteNonQuery();
                        }
                        catch (SqlException)
                        {
                            MessageBox.Show("Impossível excluir o cliente selecionado.");
                            sucesso = false;
                        }
                    }

                    if (sucesso)
                    {
                        MessageBox.Show("Cliente excluído com sucesso!");
                        foreach (Control c in splitContainer1.Panel1.Controls)
                        {
                            if (c is TextBox)
                                c.ResetText();
                        }
                    }
                    cn.Close();
                }
            }
            else MessageBox.Show("ID inválido!");
        }

        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (iDTextBox.TextLength > 0)
            {
                SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[1].ConnectionString);
                string selectStr = "SELECT " +
                                        "Cliente.nome , " +
                                        "Sacado.nome , " +
                                        "Titulo.codigo , " +
                                        "Titulo.valor , " +
                                        "Titulo.tipo , " +
                                        "Titulo.banco , " +
                                        "Titulo.data_base , " +
                                        "Titulo.vencimento , " +
                                        "Titulo.dias , " +
                                        "Titulo.d , " +
                                        "Titulo.desagio , " +
                                        "Titulo.liquido , " +
                                        "Titulo.tipo_servico " +

                                    "FROM " +
                                        "dbo.Titulo " +
                                            "INNER JOIN dbo.Cliente ON dbo.Titulo.cliente_id = dbo.Cliente.id " +
                                            "INNER JOIN dbo.Sacado ON dbo.Titulo.sacado_id = dbo.Sacado.id " +

                                    "WHERE dbo.Titulo.cliente_id = " + iDTextBox.Text;
                cn.Open();

                using (SqlCommand selectCmd = new SqlCommand(selectStr, cn))
                {
                    SqlDataReader dr = selectCmd.ExecuteReader();

                    while (dr.Read())
                    {
                        titulosTextBox.AppendText("======================================================================================\n");
                        titulosTextBox.AppendText("CLIENTE...: " + dr["nome"].ToString() + "\n");
                        titulosTextBox.AppendText("SACADO....: " + dr[1].ToString() + "\n");
                        titulosTextBox.AppendText("VALOR.....: " + string.Format("{0:C}\n", float.Parse(dr["valor"].ToString())));
                        titulosTextBox.AppendText("======================================================================================\n");
                    }
                }

                cn.Close();
            }
        }

        private void cEPTextBox_TextChanged(object sender, EventArgs e)
        {
            if (cEPTextBox.TextLength == 5)
                cEPTextBox.AppendText("-");
        }
    }
}
